package com.example.java.newFeature;

import lombok.Builder;

// 定义不可变数据载体类，替代 Lombok 的 @Data。
// 可以用 record 记录（Record）类型来定义 VO 对象，用作前端数据传输。
// Record 类型是 Java 14 引入的新特性，用于简化不可变数据的定义和使用。
// 记录（Record）是一种特殊的类，它自动为你的数据字段生成构造函数、getter方法、equals、hashCode和toString方法，从而大大减少了样板代码。
// Record 记录没有 setter 方法，因为 Record 是不可变的。一旦使用构造函数初始化了 Record 对象后，它的属性值就不能被修改。
// 在记录（Record）上通常不使用 Lombok 注解，因为有些 Lombok 注解它不支持记录（Record）。对记录无效咯如 @Setter
// 在记录（Record）中的字段属性是 final 修饰的，不能被修改。因此不能使用 Lombok 的 @Setter 注解。
public class RecordDemo {
    public static void main(String[] args) {
        // 创建一个 Record 类型的对象
        Person person = new Person("John", 30);

        // 访问 Record 类型对象的属性
        System.out.println("Name: " + person.name());
        System.out.println("Age: " + person.age());

        // 尝试修改 Record 类型对象的属性
        // person.setName("Jane"); // 编译错误，Record 类型是不可变的
        Person person1 = Person.builder().name("Jane").age(25).build();// 正确方式，使用 builder() 方法创建新的对象
        System.out.println(person1);
    }

    // 定义 Record 类型
    // @Setter 不能在 Record 类型上，使用 @Setter 注解。会报错
    @Builder
    public record Person(String name, int age) {}

}

// 一个记录一个文件，和 POJO 类类似，但更简洁和易用。

/*
注意事项：
    不可变性：记录是不可变的。所有字段在隐式生成的构造函数中被最终（final）修饰，所以你不能在创建记录后修改它们的值。
    序列化：记录默认实现了java.io.Serializable接口，所以它们可以被序列化和反序列化。
    局限性：记录不能继承其他类或实现接口（除了java.io.Serializable），并且它们自己也不能被继承。
*/